/***********************************************************************************
 * 文件名： mcu.h
 * 作者： 刘言
 * 版本： 1
 * 说明：
 * 		MCU 所有的驱动顶层文件，使用MCU驱动只用包含这一个文件即可。
 * 修改记录：
 * 	2024/6/6: 初版。 刘言。
***********************************************************************************/
#ifndef _MCU_H_
#define _MCU_H_

#ifdef __cplusplus
 extern "C" {
#endif



#include "PY32_Config.h"
#include "..\ARM\typedef.h"
#include "..\ARM\polsys_armlib.h"

// /* -------  Start of section using anonymous unions and disabling warnings  ------- */
// #if   defined (__CC_ARM)
//   #pragma push
//   #pragma anon_unions
// #elif defined (__ICCARM__)
//   #pragma language=extended
// #elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
//   #pragma clang diagnostic push
//   #pragma clang diagnostic ignored "-Wc11-extensions"
//   #pragma clang diagnostic ignored "-Wreserved-id-macro"
// #elif defined (__GNUC__)
//   /* anonymous unions are enabled by default */
// #elif defined (__TMS470__)
//   /* anonymous unions are enabled by default */
// #elif defined (__TASKING__)
//   #pragma warning 586
// #elif defined (__CSMC__)
//   /* anonymous unions are enabled by default */
// #else
//   #warning Not supported compiler type
// #endif


///////////////////////////// 依据型号包含头文件

#if (defined PY32F002Bx5)
    #include "py32f0xx.h"
    #include "py32f002b_ll_rcc.h"
    #include "py32f002b_ll_bus.h"
    #include "py32f002b_ll_system.h"
    #include "py32f002b_ll_cortex.h"
    #include "py32f002b_ll_utils.h"
    #include "py32f002b_ll_pwr.h"
    #include "py32f002b_ll_gpio.h"
    #include "py32f002b_ll_exti.h"
    #include "py32f002b_ll_lptim.h"
    #if !defined  (HSI_VALUE)
        #define HSI_VALUE  24000000U   /*!< Value of the Internal oscillator in Hz*/
    #endif /* HSI_VALUE */
    #define PCLK1_DIV    1
#endif

///////////////////////////// 参数计算

#define HCLK_DIV     1

#if HSI_DIV == 0
    #define HSI_DIV_VALUE   1
#elif HSI_DIV == 1
    #define HSI_DIV_VALUE   2
#elif HSI_DIV == 2
    #define HSI_DIV_VALUE   4
#elif HSI_DIV == 3
    #define HSI_DIV_VALUE   8
#elif HSI_DIV == 4
    #define HSI_DIV_VALUE   16
#elif HSI_DIV == 5
    #define HSI_DIV_VALUE   32
#elif HSI_DIV == 6
    #define HSI_DIV_VALUE   64
#elif HSI_DIV == 7
    #define HSI_DIV_VALUE   128
#endif

#define F_HCLK  (HSI_VALUE / HSI_DIV_VALUE / HCLK_DIV)
#define F_PCLK1 (HSI_VALUE / HSI_DIV_VALUE / PCLK1_DIV)
#define F_PCLK F_PCLK1

#define SYSTICK_VALUE   (F_HCLK / 1000000 * SYSTICK_PERIOD)


///////////////////////////// 提供的API

#define Mcu_GetUid()			(u8 *)UID_BASE
#define Mcu_GetUidLength()		12

/**
 * 返回 0 表示 LSE 未准备好，上电后3秒左右 LSE 才会稳定。
 */
#define Mcu_GetLSERdy()         READ_BIT(RCC->BDCR, RCC_BDCR_LSERDY)

// 提供给 Polsys 调用 (上电后尽早调用)
void Mcu_Init(void);
#define Mcu_TickStart() SysTick_Config(SYSTICK_VALUE) // 启动系统节拍计时器

///////////////////////////// 外设驱动

#include "mcu_power.h"
#include "mcu_delay.h"
#include "mcu_flash.h"
#include "mcu_uart.h"
#include "mcu_gpio.h"
#include "mcu_exti.h"
#include "mcu_adc.h"
#include "mcu_adv_timer.h"
#include "mcu_general_timer.h"
#include "mcu_lptimer.h"
#include "mcu_wdt.h"

#ifdef __cplusplus
}
#endif

#endif

